CodecovのBash Uploaderが書き換えられた件
2021/04/15、コードカバレッジの記録サービスであるCodecovから上記のようなアナウンスが有った
端的に言うと、CodecovがCI上で使っているカバレッジファイルのアップロードスクリプトであるBashスクリプトが何者かに書き換えられ、それが3ヶ月(01/31~)気が付かなかったらしい
Bash Scriptは以下のようにCurl経由で直接形で実行する形式だった
code:bash
bash <(curl -s xxxxx/xxx.sh)
で、今回このリモートにあるbashファイルがまるごと書き換えられたとのこと
その結果、これを使っている各種プロジェクトのCIマシン上の機密データがぶっこ抜かれたらしい
何がどこからどの程度抜かれたのかは不明なのですが、上記レポートによればそういったデータが外部のサーバーに送信されたのは確定のようです
よくあるのはCIで必要となるAWSやGCPの鍵を環境変数に登録することですが、これもぶっこ抜かれたと見ていいでしょう
どうやって? env コマンドを叩いてみよう!
さて、僕のよく知る会社もプライベートプロジェクトでこの被害にあったようで、早速対応がなされました
調査の結果(CIマシンで好き放題されたという点に目を瞑れば)問題になりそうなのは環境変数にexportされたAWSマシンユーザのキーペア(AWS_SECRET_ACCESS_KEY)でした。GCPのことはよくわからないので詳しい人よろしくお願いします。
残念ながらこのキーペアが悪用されたかどうかはIAMやClodTrailではよくわからず、まぁ多分使われてないだろうと結論付けざるをえなかった
今回流出したAWSのキーペアですが、マシンユーザとして作成されており、IAMポリシーもCI用途のかなり絞られた設計になっていたため、被害は最小限に抑えられたと思われます。
具体的には、
特定のS3バケットへのPut操作(各種アセットを上げるため)
デプロイのためのECS, EC2関連の操作
といった程度で、ユーザーのデータへのアクセスに関わる権限は付与されていませんでした
このキーペアも現在はすべて失効させてあります(3ヶ月も放置されていたので今更感あるけど)
CI用AWS鍵のベストプラクティス
専用のマシンユーザを作成してそのキーペアを使う。間違っても自分のIAMのアクセスキーを登録してはいけない。
マシンユーザには、CI用途に応じて限られたIAM Policyを設定する。PolicyやARNの書式がアレでも泣くな。
リモートスクリプトの実行危険性
curl + bashはわりとコマンドのインストール方法としてのデファクトスタンダードとしての地位を確立しており、こういう危険が伴うことは承知でも、開発者は一行コピペするだけでインストールできるので誘惑に負けてしまうと思います
しかしBashでもRubyでも一度実行されたらそのユーザの権限内で好き放題されてしまうし、sudoを要求されていた日には目も当てられない
リモートスクリプトを実行する前に中身を確認する律儀な人がどれほどいるだろうか?
こういう事例を防ぐにはどうすればいいのだろうか?
しかしこれも事前にSHA-256を把握しておく必要があるし、それを一々書いていくのもあまり現実的ではない
余談
ちなみに僕はこういう理由から以前Denoの --allow-env priviledgeがあるとすべての環境変数をリストアップできるのは危ないと言っていたのですが、なかなか議論が進まずフェードアウトしてしまったら、つい最近 実装されて Deno@1.9.0にリリースされました! さぁルーク、環境変数も守れるDenoを使うんだ